DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 3 - Exemplo prático [Lógica de Negócios]

Neste terceiro artigo serão apresentadas as classes que compõe a regra de negócios do Sistema de Controle de Apólices de Seguro proposto no primeiro artigo.

Desenvolvendo uma aplicação Multicamadas para Windows em C#

Parte 3 )Camada Intermediária: Lógica de Negócios

 
Introdução
 
Este artigo é o terceiro de uma série de artigos que apresentam um exemplo prático e simples abordando o desenvolvimento em camadas em C#.
 
No primeiro artigo foi apresentado um cenário para o desenvolvimento da aplicação e criado o Banco de Dados com as respectivas tabelas e o mapeamento Entidade Relacionamento entre elas.
 
No segundo artigo dessa série foi apresentada a classes da camada “2 – Camada Intermediaria” que representa a lógica do controlador, classe essa que faz a interface entre a lógica de negócio e os dados no banco de dados.
 


Figura  SEQ Figura \* ARABIC 1 - Lógica de Negócios
 
Neste terceiro artigo serão apresentadas as classes que compõe a regra de negócios do Sistema de Controle de Apólices de Seguro proposto no primeiro artigo.
 
A lógica de negócios na camada 2 apresentada impõe as regras de negócio e garantem a confiabilidade dos dados, antes que o aplicativo servidor atualize o banco de dados ou apresente os dados para os usuários (negociação feita nessa camadas, pela classe que representa a lógica do controlador). As regras de negócio dizem como os clientes podem e não podem acessar os dados do aplicativo e como os aplicativos processam esses dados.
 

2 – Camada Intermediaria: Lógica de Negócios

 
A primeira classe que será apresentada é a classe clnClientes.cs, nesta classe serão definidos os campos membros, atributos/propriedades e métodos.
 
Como boa prática de programação as variáveis de instância da classe estarão definida como PRIVATE, sendo acessíveis apenas dentro da própria classe pelas propriedades que utilizaremos através de seus métodos de acesso para exibir ou ler os dados. (Métodos Get e Set).
 

Mão na Massa:

 
1) Com o aplicativo aberto Seguros_OO, dê um clique com o botão direito do mouse sobre a pasta [Logica Negocios], selecione a opção ADD à New Item e Adicione uma nova classe, com o nome “clnClientes.cs”.


Figura 2 – Classe Clientes
 
 
Nota do Autor: Procurei comentar ao máximo esta classe, para que facilite o entendimento, no entanto, caso algo não fique claro, podem-me escrever, sempre coloco o meu e-mail no final dos artigos. Nessa camada você poderia implementar algumas regras que ao longo dos artigos não vou definir, pois o objetivo aqui é não complicar o entendimento. Mas fique a vontade para incluir regras nessa camada, tais como checagem dos dados, consistência de valores.
 
Antes de digitar o código, a classe clnClientes.cs a figura abaixo mostra como ela está definida:

Figura  SEQ Figura \* ARABIC 3 - Detalhes da Classe clnClientes.cs
 
Pronto agora é só digitar, ou copiar, se assim o preferir:
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
 
namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios
{
    public class clnClientes
    {
        //1 - Campos privados a classe
        private int idCli;
        private string nomeCli;
        private string enderecoCli;
        private string foneCli;
        private string faxCli;
        private string obsCli;
 
        //2 - propriedades, acesso aos campos privados
        public int IdCli
        {
            get { return idCli; }
            set { idCli = value; }
        }
        public string NomeCli
        {
            get { return nomeCli; }
            set { nomeCli = value; }
        }
        public string EnderecoCli
        {
            get { return enderecoCli; }
            set { enderecoCli = value; }
        }
        public string FoneCli
        {
            get { return foneCli; }
            set { foneCli = value; }
        }
        public string FaxCli
        {
            get { return faxCli; }
            set { faxCli = value; }
        }
        public string ObsCli
        {
            get { return obsCli; }
            set { obsCli = value; }
        }
 
        //3 - métodos da classe de Negócios (clnCliente.cs)
       
        //3.1 Buscar dados do cliente cujo codigo foi especificado
        public void Buscar()
        {
            string csql;
            csql = "Select * From tbCliente where idCli=" + IdCli;
            DataSet ds;
            clsDados seguros = new clsDados();
            ds = seguros.RetornarDataSet(csql);
            if (ds.Tables[0].Rows.Count > 0)
            {
                Array dados = ds.Tables[0].Rows[0].ItemArray;
                idCli = Convert.ToInt16(dados.GetValue(0));
                nomeCli = Convert.ToString(dados.GetValue(1));
                enderecoCli = Convert.ToString(dados.GetValue(2));
                foneCli = Convert.ToString(dados.GetValue(3));
                faxCli = Convert.ToString(dados.GetValue(4));
                obsCli = Convert.ToString(dados.GetValue(5));
            }
        }
       
        //3.2 Buscar o próximo Id Numerico para
        //inclusao de um novo cliente.
        public int BuscarId()
        {
            string csql;
            csql = "Select Top 1 (IdCli) From TbCliente order by IdCli desc";
            int IdBuscado;
            clsDados seguros = new clsDados();
            IdBuscado=seguros.RetornarIdNumerico(csql);
            return IdBuscado;
        }
 
        //3.3 Método para incluir um novo cliente no
        //Banco de dados
        public void Gravar()
        {
            StringBuilder csql = new StringBuilder();
            csql.Append("Insert into tbCliente");
            csql.Append("(");
            csql.Append("idCli,");
            csql.Append("nomeCli,");
            csql.Append("enderecoCli,");
            csql.Append("foneCli,");
            csql.Append("faxCli,");
            csql.Append("obsCli) Values(");
            csql.Append(idCli);
            csql.Append(",'" + nomeCli +"',");
            csql.Append("'" + enderecoCli + "',");
            csql.Append("'" + foneCli  + "',");
            csql.Append("'" + faxCli + "',");
            csql.Append("'" + obsCli + "')");
            clsDados seguros = new clsDados();
            seguros.ExecutarComando(csql.ToString());
        }
 
        //3.4 Método para atualizar (alterar um registro)
        public void Atualizar()
        {
            StringBuilder csql = new StringBuilder();
            csql.Append("Update tbCliente ");
            csql.Append("set idCli=");
            csql.Append(IdCli);
            csql.Append(", nomeCli='");
            csql.Append(nomeCli);
            csql.Append("', enderecoCli='");
            csql.Append(enderecoCli);
            csql.Append("', foneCli='");
            csql.Append(foneCli);
            csql.Append("', faxCli='");
            csql.Append(faxCli);
            csql.Append("', obsCli='");
            csql.Append(obsCli);
            csql.Append("' where idCli=");
            csql.Append(IdCli);
            clsDados seguros = new clsDados();
            seguros.ExecutarComando(csql.ToString());
        }
      
        //3.5 Método para excluir um cliente do
        //Banco de dados
        public void Excluir()
        {
            StringBuilder csql = new StringBuilder();
            csql.Append("Delete From tbCliente ");
            csql.Append(" where idCli=");
            csql.Append(IdCli);
            clsDados seguros = new clsDados();
            seguros.ExecutarComando(csql.ToString());
        }
    }
}
 
 

Conclusão

 
Nesse terceiro artigo foi apresentada a primeira classe que compõe a regras de negócios do Sistema de Controle de Apólices de Seguro proposto.
 
Como já apresentado a lógica de negócios na camada 2 impõe as regras de negócio e garantem a confiabilidade dos dados, antes que o aplicativo servidor atualize o banco de dados ou apresente os dados para os usuários (acesso aos dados: tarefa da classe clnDados.cs – lógica do controlador).
 
Ao final dessa série de artigos, disponibilizarei o código dessa aplicação exemplo. No  entando fica como desafio ao leitor, criar as demais classes básicas que compões a lógica de negócios.
 
No próximo artigo será apresentado a camada de apresentação, onde serão criados o formulário para cadastro de dados do cliente e o formulário de pesquisa genérico que poderá ser utilizado em toda a aplicação.
 
Nota Importante: Neste exemplo não separamos as camadas em projetos diferentes dentro de uma solução. Usamos apenas pastas (folders) para isso. Nada impede que você adote essa prática, projetos maiores ficam de forma melhor organizados com esse procedimento. A única coisa é que não pode-se esquecer de colocar as referências aos projetos em uso. Ex: o projeto que conteriam as regras de negócio teriam que ter uma referencia adicionada ao projeto do controlador, e assim por diante.
 
Qualquer dúvida quanto a esse artigo entre em contato pelo e-mail: professormoraes_arroba_gmail.com.
 
Um grande abraço, e até o próximo artigo.
 
Marcos Roberto de Moraes
 
 
 
 
 
 
 
 
 




    11 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Laércio Queiroz
Olá Marcos, parabéns pelo artigo. Tenho algumas considerações sobre o artigo: 1) Dentro de sua Camada Intermediária existe uma classe denominada "Lógica do Controlador". IMHO, acho que este não seja um nome adequado para esta classe. Como o seu objetivo é abstrair algumas operações com o banco de dados um nome que mais relacionado à persistência ficaria melhor. Isso evita que profissionais menos experientes possam confundir o papel desta classe com o componente Controller do MVC. 2) Senti a falta de “comportamento” na classe Cliente. 3) Seria interessante você ressaltar no artigo que a abordagem adotada para persistência - código de acesso a dados dentro do objeto de negócio – deve ser evitada em projetos mais complexos, por diversos motivos. Ao invés disto, usaríamos objetos que façam o mapeamento entre os objetos de domínio com o banco de dados ou uma outra fonte qualquer. Desta forma, os objetos de negócio ficam livres do mecanismo de persistência e no máximo sabem da existência de um repositório de objetos. Aguardo os próximos artigos. Grande Abraço. Laércio Queiroz http://laercioqueiroz.wordpress.com
[há +1 ano] - Responder

 

Marcos Roberto De Moraes
Perfeita sua observação. O Nome adotado segue uma notação mais utilizada em termos da abstração de Dados. Como no começo me referencie as anotações de Deitel sobre a linguagem talvez (tenho quase certeza) a tradução técnica não esteja a melhor possível (vamos entender aqui controlador) como parte da camada que lida diretamente com os dados e não (jamais) com o Controller do MVC. Quanto ao objeto Mapeamento, creio eu que aqui no próprio portal, tem ótimos artigos como as vídeo aulas sobre o NHibernate propostas pelo Regilan que mostram o funcionamento dos componentes do MVC. Mas fico muito GRATO pelas suas observações. E com certeza em projetos maiores é melhor essa divisão. Acho que a própria nota no final desse documento leva o leitor a essa consideração. Mais uma vez obrigado pelas considerações.
[há +1 ano] - Responder
 

Marcos Roberto De Moraes
As vídeo aulas são do Rodrigo e não do Regilan, sorry. :-)
[há +1 ano] - Responder
 

Emilio Ap Mazola

Boa noite, Deus Abençoe esclareceu minhas duvidas

Muito bom mesmo

Fico aguardando por mais uma obra de arte

Obrigado Emilio Saron Eletrônica.

 

[há +1 ano] - Responder

 

Ivair Teodoro
Prof. Moraes esta dando este dois erros no exemplo 3.
Será q poderia me ajudar

using system;
using system.collections.generic;
using system.text;
using system.data;
using system.data.sqlclient;
 
namespace seguros_oo.camada_intermediaria.logica_negocios
{
    public class clnclientes
    {
        //1 - campos privados a classe
        private int idcli;
        private string nomecli;
        private string enderecocli;
        private string fonecli;
        private string faxcli;
        private string obscli;
 
        //2 - propriedades, acesso aos campos privados
        public int idcli

Error    1    The type ''seguros_oo.Camada_Intermediaria.Logica_Negocios.clnclientes'' already contains a definition for ''idcli''   

    clsdados seguros = new clsdados();

Error    1    The type or namespace name ''clsdados'' could not be found (are you missing a using directive or an assembly reference?)

 

[há +1 ano] - Responder

 

[autor] Marcos Roberto De Moraes
Error 1 The type ''seguros_oo.Camada_Intermediaria.Logica_Negocios.clnclientes'' already contains a definition for ''idcli'' ==> Veja se não é o case sensitive. Maiúsculo / Minúsculo. Se persistir os erros baixe o projeto que está disponível na última aula e compare. Qq coisa escreva.
[há +1 ano] - Responder
 

Ivair Teodoro
clsdados seguros = new clsdados();

Error    1    The type or namespace name ''clsdados'' could not be found (are you missing a using directive or an assembly reference?) 

Ja tentei referenciar varios assembly,mas continua mesmo erro.
Tentei baixar o exemplo pronto p/ conferir com o meu,mas não acha o arquivo.
Obrigado pela resposta. 
[há +1 ano] - Responder
 

Ivair Teodoro
No final do Parte 3,vc pede fazer uma referencia regras de negocio a projeto controlador.Como Faço
Isto.
Obrigado
Ivair
[há +1 ano] - Responder
 

Peterson De Aquino
Boa tarde, Para fazer a referência é necessário colocar este ''using'': using GNS.Camada_Intermediaria.Logica_Controlador; Até mais.
[há +1 ano] - Responder
 

Mário Mineiro
Olá Prof Marcos.
Desde já os meus parabéns pelo conjuntos de artigos muito bem conseguidos e de muito interesse didáctico.
No entanto fico com duas duvidas:

1ªComo implementar no caso da clnClientes estar relacionada com uma tabela com um atributo/campo SQL do tipo "image" para por exemplo colocar a fotografia do cliente.
2ªComo lidar com atributos que permitem NULOS (Allow Nulls) na base de dados?

Poderias dar uma ajudinha na forma de implementar a solução por exemplo nos métodos Gravar e Atualizar da clnClientes e no evento do  private void txtidApolice_Leave do FrmApolices?

Abraços,
[há +1 ano] - Responder

 

Luiz Agnelo C. Maia
Mário,
 
No caso de gravar em campo do tipo Image no SQL, vc deve converter a imagem em bites [binário]:
 
 
Para atributos que permitem Nulls, faça o seguinte:
SqlParameter param = new SqlParameter("@Qty", txt1.Text.Trim().Length==0?DBNull.Value:int.Parse(txt1.Text));
[há +1 ano] - Responder
 



[Este post ainda não foi associado a uma sequência]
Publicidade
Autor
Marcos Roberto De Moraes

Mestre em Educação pela UNISAL.
Especialista em Administração de Sistemas de Informação pela Universidade Federal de Lavras-MG (UFLA).
Licenciado pleno em informática pela Universidade Metodista de Piracicaba (UNIMEP).
Graduado em Tecnologia em Processamento de Dados pela Unipinhal.
...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
11   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03